home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
X User Tools
/
X User Tools (O'Reilly and Associates)(1994).ISO
/
sources
/
xev
/
xev.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-09-27
|
26KB
|
952 lines
/*
* xev - event diagnostics
*
* $XConsortium: xev.c,v 1.14 91/05/04 23:15:11 keith Exp $
*
* Copyright 1988 Massachusetts Institute of Technology
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of M.I.T. not be used in advertising or
* publicity pertaining to distribution of the software without specific,
* written prior permission. M.I.T. makes no representations about the
* suitability of this software for any purpose. It is provided "as is"
* without express or implied warranty.
*
* Author: Jim Fulton, MIT X Consortium
*/
#include <stdio.h>
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xproto.h>
#include <ctype.h>
#define INNER_WINDOW_WIDTH 50
#define INNER_WINDOW_HEIGHT 50
#define INNER_WINDOW_BORDER 4
#define INNER_WINDOW_X 10
#define INNER_WINDOW_Y 10
#define OUTER_WINDOW_MIN_WIDTH (INNER_WINDOW_WIDTH + \
2 * (INNER_WINDOW_BORDER + INNER_WINDOW_X))
#define OUTER_WINDOW_MIN_HEIGHT (INNER_WINDOW_HEIGHT + \
2 * (INNER_WINDOW_BORDER + INNER_WINDOW_Y))
#define OUTER_WINDOW_DEF_WIDTH (OUTER_WINDOW_MIN_WIDTH + 100)
#define OUTER_WINDOW_DEF_HEIGHT (OUTER_WINDOW_MIN_HEIGHT + 100)
#define OUTER_WINDOW_DEF_X 100
#define OUTER_WINDOW_DEF_Y 100
typedef unsigned long Pixel;
char *Yes = "YES";
char *No = "NO";
char *Unknown = "unknown";
char *ProgramName;
Display *dpy;
int screen;
usage ()
{
static char *msg[] = {
" -display displayname X server to contact",
" -geometry geom size and location of window",
" -bw pixels border width in pixels",
" -bs {NotUseful,WhenMapped,Always} backingstore attribute",
" -id windowid use existing window",
" -s set save-unders attribute",
" -name string window name",
" -rv reverse video",
"",
NULL};
char **cpp;
fprintf (stderr, "usage: %s [-options ...]\n", ProgramName);
fprintf (stderr, "where options include:\n");
for (cpp = msg; *cpp; cpp++) {
fprintf (stderr, "%s\n", *cpp);
}
exit (1);
}
static int parse_backing_store (s)
char *s;
{
int len = strlen (s);
char *cp;
for (cp = s; *cp; cp++) {
if (isascii (*cp) && isupper (*cp)) *cp = tolower (*cp);
}
if (strncmp (s, "notuseful", len) == 0) return (NotUseful);
if (strncmp (s, "whenmapped", len) == 0) return (WhenMapped);
if (strncmp (s, "always", len) == 0) return (Always);
usage ();
}
main (argc, argv)
int argc;
char **argv;
{
char *displayname = NULL;
char *geom = NULL;
int i;
XSizeHints hints;
int borderwidth = 2;
Window w, subw;
XSetWindowAttributes attr;
XWindowAttributes wattr;
unsigned long mask = 0L;
int done;
char *name = "Event Tester";
Bool reverse = False;
unsigned long back, fore;
w = 0;
ProgramName = argv[0];
for (i = 1; i < argc; i++) {
char *arg = argv[i];
if (arg[0] == '-') {
switch (arg[1]) {
case 'd': /* -display host:dpy */
if (++i >= argc) usage ();
displayname = argv[i];
continue;
case 'g': /* -geometry geom */
if (++i >= argc) usage ();
geom = argv[i];
continue;
case 'b':
switch (arg[2]) {
case 'w': /* -bw pixels */
if (++i >= argc) usage ();
borderwidth = atoi (argv[i]);
continue;
case 's': /* -bs type */
if (++i >= argc) usage ();
attr.backing_store = parse_backing_store (argv[i]);
mask |= CWBackingStore;
continue;
default:
usage ();
}
case 'i': /* -id */
if (++i >= argc) usage ();
sscanf(argv[i], "0x%lx", &w);
if (!w)
sscanf(argv[i], "%ld", &w);
if (!w)
usage ();
continue;
case 'n': /* -name */
if (++i >= argc) usage ();
name = argv[i];
continue;
case 'r': /* -rv */
reverse = True;
continue;
case 's': /* -s */
attr.save_under = True;
mask |= CWSaveUnder;
continue;
default:
usage ();
} /* end switch on - */
} else
usage ();
} /* end for over argc */
dpy = XOpenDisplay (displayname);
if (!dpy) {
fprintf (stderr, "%s: unable to open display '%s'\n",
ProgramName, XDisplayName (displayname));
exit (1);
}
screen = DefaultScreen (dpy);
/* select for all events */
attr.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask |
ButtonReleaseMask | EnterWindowMask |
LeaveWindowMask | PointerMotionMask |
Button1MotionMask |
Button2MotionMask | Button3MotionMask |
Button4MotionMask | Button5MotionMask |
ButtonMotionMask | KeymapStateMask |
ExposureMask | VisibilityChangeMask |
StructureNotifyMask | /* ResizeRedirectMask | */
SubstructureNotifyMask | SubstructureRedirectMask |
FocusChangeMask | PropertyChangeMask |
ColormapChangeMask | OwnerGrabButtonMask;
if (w) {
XGetWindowAttributes(dpy, w, &wattr);
if (wattr.all_event_masks & ButtonPressMask)
attr.event_mask &= ~ButtonPressMask;
attr.event_mask &= ~SubstructureRedirectMask;
XSelectInput(dpy, w, attr.event_mask);
} else {
set_sizehints (&hints, OUTER_WINDOW_MIN_WIDTH, OUTER_WINDOW_MIN_HEIGHT,
OUTER_WINDOW_DEF_WIDTH, OUTER_WINDOW_DEF_HEIGHT,
OUTER_WINDOW_DEF_X, OUTER_WINDOW_DEF_Y, geom);
if (reverse) {
back = BlackPixel(dpy,screen);
fore = WhitePixel(dpy,screen);
} else {
back = WhitePixel(dpy,screen);
fore = BlackPixel(dpy,screen);
}
attr.background_pixel = back;
attr.border_pixel = fore;
mask |= (CWBackPixel | CWBorderPixel | CWEventMask);
w = XCreateWindow (dpy, RootWindow (dpy, screen), hints.x, hints.y,
hints.width, hints.height, borderwidth, 0,
InputOutput, (Visual *)CopyFromParent,
mask, &attr);
XSetStandardProperties (dpy, w, name, NULL, (Pixmap) 0,
argv, argc, &hints);
subw = XCreateSimpleWindow (dpy, w, INNER_WINDOW_X, INNER_WINDOW_Y,
INNER_WINDOW_WIDTH, INNER_WINDOW_HEIGHT,
INNER_WINDOW_BORDER,
attr.border_pixel, attr.background_pixel);
XMapWindow (dpy, subw); /* map before w so that it appears */
XMapWindow (dpy, w);
printf ("Outer window is 0x%lx, inner window is 0x%lx\n", w, subw);
}
for (done = 0; !done; ) {
XEvent event;
XNextEvent (dpy, &event);
switch (event.type) {
case KeyPress:
prologue (&event, "KeyPress");
do_KeyPress (&event);
break;
case KeyRelease:
prologue (&event, "KeyRelease");
do_KeyRelease (&event);
break;
case ButtonPress:
prologue (&event, "ButtonPress");
do_ButtonPress (&event);
break;
case ButtonRelease:
prologue (&event, "ButtonRelease");
do_ButtonRelease (&event);
break;
case MotionNotify:
prologue (&event, "MotionNotify");
do_MotionNotify (&event);
break;
case EnterNotify:
prologue (&event, "EnterNotify");
do_EnterNotify (&event);
break;
case LeaveNotify:
prologue (&event, "LeaveNotify");
do_LeaveNotify (&event);
break;
case FocusIn:
prologue (&event, "FocusIn");
do_FocusIn (&event);
break;
case FocusOut:
prologue (&event, "FocusOut");
do_FocusOut (&event);
break;
case KeymapNotify:
prologue (&event, "KeymapNotify");
do_KeymapNotify (&event);
break;
case Expose:
prologue (&event, "Expose");
do_Expose (&event);
break;
case GraphicsExpose:
prologue (&event, "GraphicsExpose");
do_GraphicsExpose (&event);
break;
case NoExpose:
prologue (&event, "NoExpose");
do_NoExpose (&event);
break;
case VisibilityNotify:
prologue (&event, "VisibilityNotify");
do_VisibilityNotify (&event);
break;
case CreateNotify:
prologue (&event, "CreateNotify");
do_CreateNotify (&event);
break;
case DestroyNotify:
prologue (&event, "DestroyNotify");
do_DestroyNotify (&event);
break;
case UnmapNotify:
prologue (&event, "UnmapNotify");
do_UnmapNotify (&event);
break;
case MapNotify:
prologue (&event, "MapNotify");
do_MapNotify (&event);
break;
case MapRequest:
prologue (&event, "MapRequest");
do_MapRequest (&event);
break;
case ReparentNotify:
prologue (&event, "ReparentNotify");
do_ReparentNotify (&event);
break;
case ConfigureNotify:
prologue (&event, "ConfigureNotify");
do_ConfigureNotify (&event);
break;
case ConfigureRequest:
prologue (&event, "ConfigureRequest");
do_ConfigureRequest (&event);
break;
case GravityNotify:
prologue (&event, "GravityNotify");
do_GravityNotify (&event);
break;
case ResizeRequest:
prologue (&event, "ResizeRequest");
do_ResizeRequest (&event);
break;
case CirculateNotify:
prologue (&event, "CirculateNotify");
do_CirculateNotify (&event);
break;
case CirculateRequest:
prologue (&event, "CirculateRequest");
do_CirculateRequest (&event);
break;
case PropertyNotify:
prologue (&event, "PropertyNotify");
do_PropertyNotify (&event);
break;
case SelectionClear:
prologue (&event, "SelectionClear");
do_SelectionClear (&event);
break;
case SelectionRequest:
prologue (&event, "SelectionRequest");
do_SelectionRequest (&event);
break;
case SelectionNotify:
prologue (&event, "SelectionNotify");
do_SelectionNotify (&event);
break;
case ColormapNotify:
prologue (&event, "ColormapNotify");
do_ColormapNotify (&event);
break;
case ClientMessage:
prologue (&event, "ClientMessage");
do_ClientMessage (&event);
break;
case MappingNotify:
prologue (&event, "MappingNotify");
do_MappingNotify (&event);
break;
default:
printf ("Unknown event type %d\n", event.type);
break;
}
}
XCloseDisplay (dpy);
exit (0);
}
prologue (eventp, event_name)
XEvent *eventp;
char *event_name;
{
XAnyEvent *e = (XAnyEvent *) eventp;
printf ("\n%s event, serial %ld, synthetic %s, window 0x%lx,\n",
event_name, e->serial, e->send_event ? Yes : No, e->window);
return;
}
do_KeyPress (eventp)
XEvent *eventp;
{
XKeyEvent *e = (XKeyEvent *) eventp;
KeySym ks;
char *ksname;
int nbytes;
char str[256+1];
nbytes = XLookupString (e, str, 256, &ks, NULL);
if (ks == NoSymbol)
ksname = "NoSymbol";
else if (!(ksname = XKeysymToString (ks)))
ksname = "(no name)";
printf (" root 0x%lx, subw 0x%lx, time %lu, (%d,%d), root:(%d,%d),\n",
e->root, e->subwindow, e->time, e->x, e->y, e->x_root, e->y_root);
printf (" state 0x%x, keycode %u (keysym 0x%x, %s), same_screen %s,\n",
e->state, e->keycode, ks, ksname, e->same_screen ? Yes : No);
if (nbytes < 0) nbytes = 0;
if (nbytes > 256) nbytes = 256;
str[nbytes] = '\0';
printf (" XLookupString gives %d characters: \"%s\"\n", nbytes, str);
return;
}
do_KeyRelease (eventp)
XEvent *eventp;
{
do_KeyPress (eventp); /* since it has the same info */
return;
}
do_ButtonPress (eventp)
XEvent *eventp;
{
XButtonEvent *e = (XButtonEvent *) eventp;
printf (" root 0x%lx, subw 0x%lx, time %lu, (%d,%d), root:(%d,%d),\n",
e->root, e->subwindow, e->time, e->x, e->y, e->x_root, e->y_root);
printf (" state 0x%x, button %u, same_screen %s\n",
e->state, e->button, e->same_screen ? Yes : No);
return;
}
do_ButtonRelease (eventp)
XEvent *eventp;
{
do_ButtonPress (eventp); /* since it has the same info */
return;
}
do_MotionNotify (eventp)
XEvent *eventp;
{
XMotionEvent *e = (XMotionEvent *) eventp;
printf (" root 0x%lx, subw 0x%lx, time %lu, (%d,%d), root:(%d,%d),\n",
e->root, e->subwindow, e->time, e->x, e->y, e->x_root, e->y_root);
printf (" state 0x%x, is_hint %u, same_screen %s\n",
e->state, e->is_hint, e->same_screen ? Yes : No);
return;
}
do_EnterNotify (eventp)
XEvent *eventp;
{
XCrossingEvent *e = (XCrossingEvent *) eventp;
char *mode, *detail;
char dmode[10], ddetail[10];
switch (e->mode) {
case NotifyNormal: mode = "NotifyNormal"; break;
case NotifyGrab: mode = "NotifyGrab"; break;
case NotifyUngrab: mode = "NotifyUngrab"; break;
case NotifyWhileGrabbed: mode = "NotifyWhileGrabbed"; break;
default: mode = dmode, sprintf (dmode, "%u", e->mode); break;
}
switch (e->detail) {
case NotifyAncestor: detail = "NotifyAncestor"; break;
case NotifyVirtual: detail = "NotifyVirtual"; break;
case NotifyInferior: detail = "NotifyInferior"; break;
case NotifyNonlinear: detail = "NotifyNonlinear"; break;
case NotifyNonlinearVirtual: detail = "NotifyNonlinearVirtual"; break;
case NotifyPointer: detail = "NotifyPointer"; break;
case NotifyPointerRoot: detail = "NotifyPointerRoot"; break;
case NotifyDetailNone: detail = "NotifyDetailNone"; break;
default: detail = ddetail; sprintf (ddetail, "%u", e->detail); break;
}
printf (" root 0x%lx, subw 0x%lx, time %lu, (%d,%d), root:(%d,%d),\n",
e->root, e->subwindow, e->time, e->x, e->y, e->x_root, e->y_root);
printf (" mode %s, detail %s, same_screen %s,\n",
mode, detail, e->same_screen ? Yes : No);
printf (" focus %s, state %u\n", e->focus ? Yes : No, e->state);
return;
}
do_LeaveNotify (eventp)
XEvent *eventp;
{
do_EnterNotify (eventp); /* since it has same information */
return;
}
do_FocusIn (eventp)
XEvent *eventp;
{
XFocusChangeEvent *e = (XFocusChangeEvent *) eventp;
char *mode, *detail;
char dmode[10], ddetail[10];
switch (e->mode) {
case NotifyNormal: mode = "NotifyNormal"; break;
case NotifyGrab: mode = "NotifyGrab"; break;
case NotifyUngrab: mode = "NotifyUngrab"; break;
case NotifyWhileGrabbed: mode = "NotifyWhileGrabbed"; break;
default: mode = dmode, sprintf (dmode, "%u", e->mode); break;
}
switch (e->detail) {
case NotifyAncestor: detail = "NotifyAncestor"; break;
case NotifyVirtual: detail = "NotifyVirtual"; break;
case NotifyInferior: detail = "NotifyInferior"; break;
case NotifyNonlinear: detail = "NotifyNonlinear"; break;
case NotifyNonlinearVirtual: detail = "NotifyNonlinearVirtual"; break;
case NotifyPointer: detail = "NotifyPointer"; break;
case NotifyPointerRoot: detail = "NotifyPointerRoot"; break;
case NotifyDetailNone: detail = "NotifyDetailNone"; break;
default: detail = ddetail; sprintf (ddetail, "%u", e->detail); break;
}
printf (" mode %s, detail %s\n", mode, detail);
return;
}
do_FocusOut (eventp)
XEvent *eventp;
{
do_FocusIn (eventp); /* since it has same information */
return;
}
do_KeymapNotify (eventp)
XEvent *eventp;
{
XKeymapEvent *e = (XKeymapEvent *) eventp;
int i;
printf (" keys: ");
for (i = 0; i < 32; i++) {
if (i == 16) printf ("\n ");
printf ("%-3u ", (unsigned int) e->key_vector[i]);
}
printf ("\n");
return;
}
do_Expose (eventp)
XEvent *eventp;
{
XExposeEvent *e = (XExposeEvent *) eventp;
printf (" (%d,%d), width %d, height %d, count %d\n",
e->x, e->y, e->width, e->height, e->count);
return;
}
do_GraphicsExpose (eventp)
XEvent *eventp;
{
XGraphicsExposeEvent *e = (XGraphicsExposeEvent *) eventp;
char *m;
char mdummy[10];
switch (e->major_code) {
case X_CopyArea: m = "CopyArea"; break;
case X_CopyPlane: m = "CopyPlane"; break;
default: m = mdummy; sprintf (mdummy, "%d", e->major_code); break;
}
printf (" (%d,%d), width %d, height %d, count %d,\n",
e->x, e->y, e->width, e->height, e->count);
printf (" major %s, minor %d\n", m, e->minor_code);
return;
}
do_NoExpose (eventp)
XEvent *eventp;
{
XNoExposeEvent *e = (XNoExposeEvent *) eventp;
char *m;
char mdummy[10];
switch (e->major_code) {
case X_CopyArea: m = "CopyArea"; break;
case X_CopyPlane: m = "CopyPlane"; break;
default: m = mdummy; sprintf (mdummy, "%d", e->major_code); break;
}
printf (" major %s, minor %d\n", m, e->minor_code);
return;
}
do_VisibilityNotify (eventp)
XEvent *eventp;
{
XVisibilityEvent *e = (XVisibilityEvent *) eventp;
char *v;
char vdummy[10];
switch (e->state) {
case VisibilityUnobscured: v = "VisibilityUnobscured"; break;
case VisibilityPartiallyObscured: v = "VisibilityPartiallyObscured"; break;
case VisibilityFullyObscured: v = "VisibilityFullyObscured"; break;
default: v = vdummy; sprintf (vdummy, "%d", e->state); break;
}
printf (" state %s\n", v);
return;
}
do_CreateNotify (eventp)
XEvent *eventp;
{
XCreateWindowEvent *e = (XCreateWindowEvent *) eventp;
printf (" parent 0x%lx, window 0x%lx, (%d,%d), width %d, height %d\n",
e->parent, e->window, e->x, e->y, e->width, e->height);
printf ("border_width %d, override %s\n",
e->border_width, e->override_redirect ? Yes : No);
return;
}
do_DestroyNotify (eventp)
XEvent *eventp;
{
XDestroyWindowEvent *e = (XDestroyWindowEvent *) eventp;
printf (" event 0x%lx, window 0x%lx\n", e->event, e->window);
return;
}
do_UnmapNotify (eventp)
XEvent *eventp;
{
XUnmapEvent *e = (XUnmapEvent *) eventp;
printf (" event 0x%lx, window 0x%lx, from_configure %s\n",
e->event, e->window, e->from_configure ? Yes : No);
return;
}
do_MapNotify (eventp)
XEvent *eventp;
{
XMapEvent *e = (XMapEvent *) eventp;
printf (" event 0x%lx, window 0x%lx, override %s\n",
e->event, e->window, e->override_redirect ? Yes : No);
return;
}
do_MapRequest (eventp)
XEvent *eventp;
{
XMapRequestEvent *e = (XMapRequestEvent *) eventp;
printf (" parent 0x%lx, window 0x%lx\n", e->parent, e->window);
return;
}
do_ReparentNotify (eventp)
XEvent *eventp;
{
XReparentEvent *e = (XReparentEvent *) eventp;
printf (" event 0x%lx, window 0x%lx, parent 0x%lx,\n",
e->event, e->window, e->parent);
printf (" (%d,%d), override %s\n", e->x, e->y,
e->override_redirect ? Yes : No);
return;
}
do_ConfigureNotify (eventp)
XEvent *eventp;
{
XConfigureEvent *e = (XConfigureEvent *) eventp;
printf (" event 0x%lx, window 0x%lx, (%d,%d), width %d, height %d,\n",
e->event, e->window, e->x, e->y, e->width, e->height);
printf (" border_width %d, above 0x%lx, override %s\n",
e->border_width, e->above, e->override_redirect ? Yes : No);
return;
}
do_ConfigureRequest (eventp)
XEvent *eventp;
{
XConfigureRequestEvent *e = (XConfigureRequestEvent *) eventp;
char *detail;
char ddummy[10];
switch (e->detail) {
case Above: detail = "Above"; break;
case Below: detail = "Below"; break;
case TopIf: detail = "TopIf"; break;
case BottomIf: detail = "BottomIf"; break;
case Opposite: detail = "Opposite"; break;
default: detail = ddummy; sprintf (ddummy, "%d", e->detail); break;
}
printf (" parent 0x%lx, window 0x%lx, (%d,%d), width %d, height %d,\n",
e->parent, e->window, e->x, e->y, e->width, e->height);
printf (" border_width %d, above 0x%lx, detail %s, value 0x%lx\n",
e->border_width, e->above, detail, e->value_mask);
return;
}
do_GravityNotify (eventp)
XEvent *eventp;
{
XGravityEvent *e = (XGravityEvent *) eventp;
printf (" event 0x%lx, window 0x%lx, (%d,%d)\n",
e->event, e->window, e->x, e->y);
return;
}
do_ResizeRequest (eventp)
XEvent *eventp;
{
XResizeRequestEvent *e = (XResizeRequestEvent *) eventp;
printf (" width %d, height %d\n", e->width, e->height);
return;
}
do_CirculateNotify (eventp)
XEvent *eventp;
{
XCirculateEvent *e = (XCirculateEvent *) eventp;
char *p;
char pdummy[10];
switch (e->place) {
case PlaceOnTop: p = "PlaceOnTop"; break;
case PlaceOnBottom: p = "PlaceOnBottom"; break;
default: p = pdummy; sprintf (pdummy, "%d", e->place); break;
}
printf (" event 0x%lx, window 0x%lx, place %s\n",
e->event, e->window, p);
return;
}
do_CirculateRequest (eventp)
XEvent *eventp;
{
XCirculateRequestEvent *e = (XCirculateRequestEvent *) eventp;
char *p;
char pdummy[10];
switch (e->place) {
case PlaceOnTop: p = "PlaceOnTop"; break;
case PlaceOnBottom: p = "PlaceOnBottom"; break;
default: p = pdummy; sprintf (pdummy, "%d", e->place); break;
}
printf (" parent 0x%lx, window 0x%lx, place %s\n",
e->parent, e->window, p);
return;
}
do_PropertyNotify (eventp)
XEvent *eventp;
{
XPropertyEvent *e = (XPropertyEvent *) eventp;
char *aname = XGetAtomName (dpy, e->atom);
char *s;
char sdummy[10];
switch (e->state) {
case PropertyNewValue: s = "PropertyNewValue"; break;
case PropertyDelete: s = "PropertyDelete"; break;
default: s = sdummy; sprintf (sdummy, "%d", e->state); break;
}
printf (" atom 0x%lx (%s), time %lu, state %s\n",
e->atom, aname ? aname : Unknown, e->time, s);
if (aname) XFree (aname);
return;
}
do_SelectionClear (eventp)
XEvent *eventp;
{
XSelectionClearEvent *e = (XSelectionClearEvent *) eventp;
char *sname = XGetAtomName (dpy, e->selection);
printf (" selection 0x%lx (%s), time %lu\n",
e->selection, sname ? sname : Unknown, e->time);
if (sname) XFree (sname);
return;
}
do_SelectionRequest (eventp)
XEvent *eventp;
{
XSelectionRequestEvent *e = (XSelectionRequestEvent *) eventp;
char *sname = XGetAtomName (dpy, e->selection);
char *tname = XGetAtomName (dpy, e->target);
char *pname = XGetAtomName (dpy, e->property);
printf (" owner 0x%lx, requestor 0x%lx, selection 0x%lx (%s),\n",
e->owner, e->requestor, e->selection, sname ? sname : Unknown);
printf (" target 0x%lx (%s), property 0x%lx (%s), time %lu\n",
e->target, tname ? tname : Unknown, e->property,
pname ? pname : Unknown, e->time);
if (sname) XFree (sname);
if (tname) XFree (tname);
if (pname) XFree (pname);
return;
}
do_SelectionNotify (eventp)
XEvent *eventp;
{
XSelectionEvent *e = (XSelectionEvent *) eventp;
char *sname = XGetAtomName (dpy, e->selection);
char *tname = XGetAtomName (dpy, e->target);
char *pname = XGetAtomName (dpy, e->property);
printf (" selection 0x%lx (%s), target 0x%lx (%s),\n",
e->selection, sname ? sname : Unknown, e->target,
tname ? tname : Unknown);
printf (" property 0x%lx (%s), time %lu\n",
e->property, pname ? pname : Unknown, e->time);
if (sname) XFree (sname);
if (tname) XFree (tname);
if (pname) XFree (pname);
return;
}
do_ColormapNotify (eventp)
XEvent *eventp;
{
XColormapEvent *e = (XColormapEvent *) eventp;
char *s;
char sdummy[10];
switch (e->state) {
case ColormapInstalled: s = "ColormapInstalled"; break;
case ColormapUninstalled: s = "ColormapUninstalled"; break;
default: s = sdummy; sprintf (sdummy, "%d", e->state); break;
}
printf (" colormap 0x%lx, new %s, state %s\n",
e->colormap, e->new ? Yes : No, s);
return;
}
do_ClientMessage (eventp)
XEvent *eventp;
{
XClientMessageEvent *e = (XClientMessageEvent *) eventp;
char *mname = XGetAtomName (dpy, e->message_type);
printf (" message_type 0x%lx (%s), format %d\n",
e->message_type, mname ? mname : Unknown, e->format);
if (mname) XFree (mname);
return;
}
do_MappingNotify (eventp)
XEvent *eventp;
{
XMappingEvent *e = (XMappingEvent *) eventp;
char *r;
char rdummy[10];
switch (e->request) {
case MappingModifier: r = "MappingModifier"; break;
case MappingKeyboard: r = "MappingKeyboard"; break;
case MappingPointer: r = "MappingPointer"; break;
default: r = rdummy; sprintf (rdummy, "%d", e->request); break;
}
printf (" request %s, first_keycode %d, count %d\n",
r, e->first_keycode, e->count);
XRefreshKeyboardMapping(e);
return;
}
set_sizehints (hintp, min_width, min_height,
defwidth, defheight, defx, defy, geom)
XSizeHints *hintp;
int min_width, min_height, defwidth, defheight, defx, defy;
char *geom;
{
int geom_result;
/* set the size hints, algorithm from xlib xbiff */
hintp->width = hintp->min_width = min_width;
hintp->height = hintp->min_height = min_height;
hintp->flags = PMinSize;
hintp->x = hintp->y = 0;
geom_result = NoValue;
if (geom != NULL) {
geom_result = XParseGeometry (geom, &hintp->x, &hintp->y,
(unsigned int *)&hintp->width,
(unsigned int *)&hintp->height);
if ((geom_result & WidthValue) && (geom_result & HeightValue)) {
#define max(a,b) ((a) > (b) ? (a) : (b))
hintp->width = max (hintp->width, hintp->min_width);
hintp->height = max (hintp->height, hintp->min_height);
hintp->flags |= USSize;
}
if ((geom_result & XValue) && (geom_result & YValue)) {
hintp->flags += USPosition;
}
}
if (!(hintp->flags & USSize)) {
hintp->width = defwidth;
hintp->height = defheight;
hintp->flags |= PSize;
}
/*
if (!(hintp->flags & USPosition)) {
hintp->x = defx;
hintp->y = defy;
hintp->flags |= PPosition;
}
*/
if (geom_result & XNegative) {
hintp->x = DisplayWidth (dpy, DefaultScreen (dpy)) + hintp->x -
hintp->width;
}
if (geom_result & YNegative) {
hintp->y = DisplayHeight (dpy, DefaultScreen (dpy)) + hintp->y -
hintp->height;
}
return;
}